
package Online;

import Offline.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * @author Alvaro Garcia Tapia
 * @author Pablo Mosquera Diaz
 * @author Victor Navarro Ortego
 * @author Adrian Neila Serrano
 * @author Daniel Sanchez Suarez
 * 
 * @proyecto Gestor de Tareas Online
 * @version 1.61
 */
public class Listas {
    
     /*
     * Variables para la conexión a la BD
     */
        private String bd = "is2"; 
        private String user = "root";
        private String url ="jdbc:mysql://localhost/" + bd+"?zeroDateTimeBehavior=convertToNull";;
        private Connection conexion;
        private java.sql.Statement statement;
        
        public Listas(){
            try {
                //Se añade la biblioteca de mysql
                Class.forName("com.mysql.jdbc.Driver");
                //Se conecta a la BD
                conexion = DriverManager.getConnection(url, user,"");
                //Se genera la variable que interacciona con la BD
                statement = conexion.createStatement();
            } catch (SQLException ex) {
            } catch (ClassNotFoundException ex) {
            }
        }
        
        /**
         * Metodo que indica el estado de la conexion
         * @return boolean
         */
        public boolean estado(){
            return (!(statement == null));
        }

        
        /**
         * Metodo que devuelve las listas de un usuario
         * @param user
         * @return Cadena de String con los nombres de las listas
         */
        public String[] getListas(String user){
            String[] listas = new String[100];
            int numlista = 0;
            try { 
               //Consulta SQL, buscando un usuario que coincida user
                String consulta = "SELECT L1.Nombre nombre FROM lista L1 Where L1.NombreUsuario = \""+user+"\""
                        +"ORDER BY L1.Fecha;";
                //Resultado de la consulta
                ResultSet result = statement.executeQuery(consulta);
                result.getRow();
                //Comprobación si hay al menos un resultado
                while (result.next()){
                    listas[numlista] = result.getString(1);
                    numlista++;
                }
            
            } catch (SQLException ex) {
                //Si no se encontraron resultados se devuelve null
                listas = null;
            }
            return listas;
        }
        
        
        /**
         * Metodo que añade una lista nueva
         * @param id
         * @param name
         * @param user
         * @return true si se ha añadido la tarea, false en otro caso
         */
        public boolean addLista(String id,String name,String user){
            boolean terminado = true;
            try { 
              //Calendar fecha = Calendar.getInstance();
                Date fecha = new Date();
              //Consulta SQL, insertado una nueva tarea
                String consulta = "INSERT INTO lista(Identificador, Nombre, NombreUsuario, Fecha)"+
                     "VALUES (\""+id+"\",\""+name+"\",\""+user+"\",\""+
                     (fecha.getYear()+1900)+"/"+(fecha.getMonth()+1)+"/"+fecha.getDate()+" "+
                     fecha.getHours()+":"+fecha.getMinutes()+":"+fecha.getSeconds()+"\");";
             //Resultado de la consulta
             int result = statement.executeUpdate(consulta);
             
             java.sql.Statement statement = conexion.createStatement();
             String idM = getMapa(user);
              //Consulta SQL, insertado una nueva tarea
             consulta = "INSERT INTO `listas de mapa`(idMapa, Nombre, x, y)"+
                     "VALUES ("+idM+",\""+user+name+"\", 0, 0);";
             //Resultado de la consulta
             result = statement.executeUpdate(consulta);
            } catch (SQLException ex) {
                //Si la consulta falla se indica
                terminado = false;
            }
            return terminado;
        }
        
        
        /**
         * Metodo para eliminar una lista
         * @param id 
         */
        public void eliminarlista(String id,String user){
            try { 
               //Consulta SQL, para borrar una tarea
                String consulta = "DELETE FROM lista"+
                                " Where Identificador = \""+id+"\";";
                //Resultado de la consulta
                int result = statement.executeUpdate(consulta);
                
             java.sql.Statement statementm = conexion.createStatement();
             String idM = getMapa(user);
              //Consulta SQL, insertado una nueva tarea
            consulta = "DELETE FROM `listas de mapa`"+
                                " Where Nombre = \""+id+"\" AND idMapa ="+idM+";";
             //Resultado de la consulta
             result = statementm.executeUpdate(consulta);
            } catch (SQLException ex) {
            }
        }
        
        
                /**
         * Metodo que devuelve las listas de un usuario
         * @param user
         * @return Cadena de String con los nombres de las listas
         */
        private String getMapa(String user){
            String listas = "";
            int numlista = 0;
            try { 
               //Consulta SQL, buscando un usuario que coincida user
                String consulta = "SELECT * FROM `mapa` L1 Where L1.Usuario = \""+user+"\""
                                + " AND L1.Nombre = \"Principal\";";
                //Resultado de la consulta
                ResultSet result = statement.executeQuery(consulta);
                result.getRow();
                //Comprobación si hay al menos un resultado
                while (result.next()){
                    listas = result.getString(1);
                    numlista++;
                }
            
            } catch (SQLException ex) {
                //Si no se encontraron resultados se devuelve null
                listas = null;
            }
            return listas;
        }
        
        
        /**
         * Metodo que devuelve las listas de un usuario
         * @param user
         * @return Cadena de String con los nombres de las listas
         */
        public Usuario getUsuario(String user){
            Usuario usuario = new Usuario(user);
            try { 
               //Consulta SQL, buscando un usuario que coincida user
                String consulta = "SELECT L1.Nombre nombre FROM lista L1 Where L1.NombreUsuario = \""+user+"\""
                        +" ORDER BY L1.Fecha;";
                //Resultado de la consulta
                ResultSet result = statement.executeQuery(consulta);
                //Comprobación si hay al menos un resultado
                while (result.next()){
                    //Consulta SQL, buscando un usuario que coincida user
                    consulta = "SELECT * FROM lista Where Identificador = \""+user+result.getString(1)+"\";";
                    java.sql.Statement statementl = conexion.createStatement();
                    //Resultado de la consulta
                    ResultSet resultl = statementl.executeQuery(consulta);
                    resultl.next();
                    String id = resultl.getString(1);
                    String nombre = resultl.getString(2);
                    String fecha = resultl.getString(4);
                    Lista lista = new Lista(id,nombre,user,fecha);
                    //Consulta SQL, buscando un usuario que coincida user
                    consulta = "SELECT * FROM tarea Where IdLista = \""+id+"\";";
                    java.sql.Statement statementt = conexion.createStatement();
                    //Resultado de la consulta
                    ResultSet resultt = statementt.executeQuery(consulta);
                    while (resultt.next()){
                        String idt = resultt.getString(1);
                        String nombret = resultt.getString(2);
                        String fechat = resultt.getString(3);
                        String tiempo = resultt.getString(4);
                        String idlista = resultt.getString(5);
                        String favorito = resultt.getString(6);
                        Tarea tarea = new Tarea(idt,nombret,tiempo,fechat,idlista,favorito);
                        lista.addtarea(tarea,false);
                    } 
                    usuario.addlista(lista);
                }
            
            } catch (SQLException ex) {
              //Logger.getLogger(Listas.class.getName()).log(Level.SEVERE, null, ex);
                usuario = null;
            }
            return usuario;
        }
    
        /**
         * Metodo para modificar un usuario y todos sus datos en la bbdd
         * @param usuario
         * @return boolean
         */
        public boolean setUsuario(Usuario usuario){
            boolean resultado = true;
            String consulta = "";
            String [] listas = usuario.getlistas();
            Lista lista;
            try {
            for(int i = 0;listas[i]!=null;i++){
                lista = usuario.getlista(i, false);
                if (lista.modificado){
                    //Consulta SQL, para actualizar la tabla de tareas
                    consulta = "UPDATE tarea SET Identificador =\""+lista.id+"\",Nombre=\""+lista.nombre+"\","
                                +"NombreUsuario=\""+lista.usuario+"\",Fecha="+lista.fecha+"\";";
                    //Resultado de la consulta
                    statement.executeUpdate(consulta);
                    
                    String[] borrados = lista.getborrados();
                    for(int k = 0; borrados[k]!=null && k<borrados.length;k++){
                        //Consulta SQL, para borrar una tarea
                        consulta = "DELETE FROM tarea"+
                                " Where Identificador = \""+borrados[k]+"\";";
                        //Resultado de la consulta
                        statement.executeUpdate(consulta);
                    }
                    
                    String [] tareas = lista.gettareas();
                    Tarea tarea;
                    for(int j = 0; tareas[j]!=null;j++){
                        tarea = lista.gettarea(j, false);
                        if(tarea.modificada){
                            //Consulta SQL, para actualizar la tabla de tareas
                            consulta = "UPDATE tarea SET Identificador =\""+tarea.id+"\",Nombre=\""+tarea.nombre+"\","
                                +"FechaLimite=\""+tarea.fecha+"\",TiempoEstimado="+tarea.tiempo+
                                " Where Identificador = \""+tarea.id+"\";";
                            //Resultado de la consulta
                            statement.executeUpdate(consulta);
                        }
                    }
                } 
               }
                String[] borrados = usuario.getborrados();
                for(int i = 0; borrados[i]!=null && i<borrados.length;i++){
                    //Consulta SQL, para borrar una tarea
                    consulta = "DELETE FROM lista"+
                                " Where Identificador = \""+borrados[i]+"\";";
                    //Resultado de la consulta
                    statement.executeUpdate(consulta);
                }
            }catch (SQLException ex) {
                    resultado = false;
                    Logger.getLogger(Listas.class.getName()).log(Level.SEVERE, null, ex);
            }
            return resultado;
        }
        
}
